Analiza sygnałów rynkowych

Autor

Jakub Tatarkiewicz

Sygnały rynkowe

Sygnały rynkowe w ujęciu rynków finansowych, to zdefiniowane w pewien określony sposób momenty w czasie, które dają informacje o stanie rynku lub pewnej jego części. Należy pamiętać, że jest to pojęcie potoczne i każdy może je definiować dla swoich potrzeb inaczej. Tym nie mniej na potrzeby ich analizy, właśnie w ten sposób zostają określone. Informacja pochodząca z sygnału, ma pomóc inwestorom w ocenie kierunku dążenia instumentów finansowych i co za tym idzie w zwiększeniu stopy zwrotu jego portfela. Dobór sygnałów jest kluczowy dla sukcesu gracza rynkowego. Kluczem jest znalezienie takich, które są stale efektywne w predykcji. Właśnie pod tym kątem będą analizowane sygnały tj. jaka jest ich efektywność na względnie dużym przedziale czasowym i w pewnym środowisku. Sukcesem będzie też dowiedzenie, że sygnał nie jest rentowny pomimo wcześniejszego przekonania o jego działaniu. Unikanie strat jest ważniejsze niż zdobywanie zysków.

Zbiór danych

Niezbędny będzie zbiór danych zawierający historyczne stany rynków (akcji i obligacji). Nie zawsze cena będzie przedmiotem uwagi. Wszelkie potrzebne dane znajdują się na następujących stronach:

Pobieranie danych

Z wyżej wymienionych stron pochodzą następujące dane:

FRED:

Dane dzienne rentowności obligacji 10-letnich oraz 2-letnich.

Yahoo Finance

Indeks SP&500 czyli 500 największych spółek z giełd USA. Są to dane dziennych świeczek zawierających:

  • Cene otwarcia
  • Cenę zamknięcia
  • Cenę minimialną
  • Cenę maksymalną
  • Wolumen transakcji

Analiza sygnałów

10-2Y

Definicja i wystąpienia

Sygnał nazywany 10Y-2Y jest definiowany jako momenty trwałego przejścia wartości różnicy rentowności obligacji 10 letnich i 2 letnich z wartości ujemnych na dodatnie. Analogicznym sygnałem jest 10Y-3M z 3 miesięcznymi obligacjami.

I dodając do tego wykres indeksu giełdowego SP&500 w postaci:

\[ \frac{\log(\text{Wartość SP\&500})}{\text{Wartość predykcji regresji liniowej } \log(\text{Wartość SP\&500})} \]

Przekształcenie indeksu w oscylator

Logarytmując indeks, widać zrównoważenie jego wzrostu, a korzystająć z tego że przypomina on oscycylację wobec prostej, wypłaszczyć go, dzieląc przez współczynnik regresji liniowej stanowiący tą prostą. Następnie MinMaxScaler służy do wyskalowania.

Wizualizacja pokazuje, że nie które sygnały nie zostały odfiltrowane tak jak założono, jednak by nie zawężać jego definicji, pozostawimy go takim jakim jest. Dokładnie przyglądając się, można ulec wrażeniu, że po sygnale, cena spada, ale przekształcimy ten wykres, aby pokazywał równolegle jak indeks zachowuje się po sygnale w skali ceny z momentu wystąpienia sygnału.

Postać ścieżkowa

Nie widać tu żadnych, szczególnych powtarzalności. Niektóre wykresy idą w góre, a inne w dół. Można zauważyć, że przez dwa lata, czyli około 500 dni roboczch na giełdzie, w pewnym momencie zachodzi istotny spadek ceny względem ceny z dnia sygnału. Tutaj spadki o co najmniej 20%.

Podsumowanie ścieżek i klasteryzacja

Przekształcając dane w podsumowania:

otrzymamy postać możliwą do sklastrowania, co zostanie wykonane, ale przed tym zostaną dodane sygnały losowe tj. losowo wybrane przedziały pięćset świeczkowe rozdzielne z przedziałami ścieżek sygnałów prawdziwych.

Nie wykazało to, żadnych istotnych różnic pomiędzy sygnałami losowymi, a realnymi. Prawdziwe sygnały są równo rozłożone po klastrach.

Podsumowanie

10Y-2Y zdefiniowane wyżej nie daje pożądanych rezultatów. Na wizualizacjach widać spadki po jego wystąpieniu, ale nigdy nie wiadomo kiedy i o ile, co czyni go nieefektywnym. Prawdopodobnym jest, że sygnał powinien zostać zdefiniowany, nie tylko warunkami historycznymi, ale też przyszłymi, czyli wychodzącymi z pozycji w przypadku nie porządanych ruchów rynku np. odwróceniu, a sygnał powinien posiadać swoje metadane takie jak długość odwrócenia krzywej rentowności, pole wykresu pod 10Y-2Y=0 czy wysokość trendu wzrostowego (np. przez SMA).

Rodzina sygnałów SMA (Simple Moving Average)

Definicja

Właśnie do tego przechodzimy. SMA-i w czasie \(t\), to średnia arytmetyczna z \(i\) ostatnich cen.

\[ SMA_i(t) = \frac{cena_t + cena_{t-1} + \dots + cena_{t-i+1}}{i} = \frac{1}{i} \sum_{k=t-i+1}^{t} a_k \]

Dodatkowo mamy pięć paramterów:

  • entry_short - cena wejścia w pozycję short
  • entry_long - cena wejścia w pozycję long
  • exit_short_threshold - cena wyjścia z pozycji short
  • exit_long_threshold - cena wyjścia z pozycji long
  • position_timeout - czas po którym pozycja się zamyka

Wartości cenowe nie są wyrażanie w walutach, a w relacji do SMA czyli \(\text{wartość\_parametru} = \frac{cena_{teraz}}{SMA_i(t)}\). Czas zamknięcia pozycji ustawiona będzie na stałe 14 dni.

Otwieranie pozycji odbywa się, gdy \(\text{wartość\_parametru} > \text{entry\_short}\) dla krótkiej pozycji, oraz \(\text{wartość\_parametru} < \text{entry\_long}\) dla długiej.

Algorytm kombinacji parametrów

Analiza SMA o wyznaczonych paramterach jest mało efektywna. Ilość potencjalnie efektywnych parametrów jest za duża, aby szukać ich ręcznie. Dobrym rozwiązaniem jest użycie algorytmu, który testuje kombinacje parametrów, co pewien skok, tworząc bazę danych wszystkich “kombinacji”. Posłużymy się taką bazą, wygenerowaną w oparciu o dane historyczne pary BTCUSD o długości 10 lat od września 2014 do sierpnia 2024. W bazie są dodatkowe parametry:

  • i - parametryzujemy okno SMA
  • multiple_entries - raczej pominiemy ze względu na abstrakcyjność działania (zakłada możliwość wchodzenia w pozycje wielokrotnie)
  • capital_percent - ilość kapitału wchodząca w pozycje

oraz zmienne wynikowe:

  • total_short_return - suma zwrotów z pozycji short (mało przydatne)
  • total_long_return - suma zwrotów z pozycji long (mało przydatne)
  • total_return - suma dwóch poprzednich
  • positions - ilość pozycji przydatna do oceny skali zabrania prowizji przez brokera oraz spreadu
  • balance - saldo końcowe (na początku równe 1)
  • ROI - roczna stopa zwrotu

Przejdziemy do analizy wyników z bazy danych o ponad 130 tysiącach różnych kombinacji.

Zakres parametrów

Poniżej przedstawiono zakresy użytych parametrów algorytmu:

\[ i \in \{3, 4, 5, 6\} \]

\[ \text{entry\_short} \in [1.00, 1.05], \text{ krok: } 0.01 \]

\[ \text{entry\_long} \in [0.95, 0.99], \text{ krok: } 0.01 \]

\[ \text{exit\_short\_threshold} \in [0.95, 0.99], \text{ krok: } 0.01 \]

\[ \text{exit\_long\_threshold} \in [\text{entry\_long}, 1.05], \text{ krok: } 0.01 \]

\[ \text{capital\_percent} \in [0.1, 0.9], \text{ krok: } 0.1 \]

\[ \text{position\_timeout} = 14 \text{ dni} \]

Ze względu na moce obliczeniowe, parametry zostały tak ograniczone, jednak ciekawe byłoby ustawienie entry_short też na wartości mniejsze od SMA, co znaczyło by przewidywanie dalszego trendu spadkowego, oraz entry_long na wartości na wartości większe od 1, czyli kontynuowanie trendu wzrostowego.

Rozkład wydajności sygnałów

Domyślnie używamy danych o paramaterze: \(\text{multiple\_entries} = FALSE\)

Jak widać, najlepiej radzi sobie algorytm używający \(SMA_3\). Wydajność maleje wraz ze wzrostem okna \(i\), co jest ciekawą informacją z niepewną interpretacją. Zwracając uwagę na najbardziej efektywny algorytm można spojrzeć, źe parametry są dosyć wyjątkowe. Wejście w pozycje long odbywa się, gdy cena jest taka jak średnia, lub niższa. Sygnałów long jest bardzo dużo. Otwarcia pozycji short są rzadkie, ponieważ cena musi być wyższa o 5% w stosunku do trzy dniowej średniej, w której jest wliczona obecna cena. Tu warto wspomnieć, że interpretacja wzrostu o 5% w ciągu ostatniego dnia, jest błędna na ogół. Zakładając dla \(SMA_3\)

\[a_n = x,\ a_{n-1} = 1000,\ a_{n-2} = 1000\] oraz \[\text{wartość\_parametru} = 1.05\] okazuje się, że \[x \approx 1077\] co przekłada się na prawie 8% dzienny wzrost. Spowodowane jest to oczywiście wpływem \(a_n\) na wartość \(SMA\). Taki spadek, lub dwa dni spadkowe pod rząd, występują rzadziej co przekłada się na mniej sygnałów. Wydajność akurat przy tych parametrach pozycji short jest to dosyć zrozumiała, kiedy spojrzymy na to iż nie ma ani jednej kombinacji parametrów, w której total_short_return jest dodatni, co jest z resztą zadziwiajace, że przy tylu iteracjach nie znalazła się nawet jedna. Wszystko to się zgadza również z faktem, że bitcoin wykazuje lepsze tempo wzrostu od SP&500, a tego logarytmując w poprzednim sygnale, ukazujemy jako funkcję wykładniczą. To jednak nie usprawiedliwia algorytmu, i należy stwierdzić, że oferuje on słabe sygnały krótkie.

Najmniej wydajne sygnały

Pokazanie najmniej wydajnych sygnałów jest możliwe jedynie przez ujawnienie całego rozkładu, ponieważ jest na poziomie doprowadzającym saldo do 0 w dużej ilości przypadków.

Powodem dla którego na rozkładzie widać granice oddzielenia niebieskiego pola, jest sposób wykonywania operacji zmiennoprzecinkowych. Pomimo poprawnych matematycznie obliczeń, saldo potrafi wyjść ujemne, bardzo bliskie zeru, co uniemożliwa obliczenia ROI za pomocą pierwiastkowania. Wtedy saldo przyjmujemy jako 0, a ROI jako -100%.

Mało konkretnych wniosków da się wysunąć z tych wykresów, chociaż dają nam spojrzenie na ogólną wydajność różnych \(i\) za pomocą heatmapy, oraz na wydajność ogólną algorytmu za pomocą rozkładu ROI. Jest ona dosyć kiepska

Strategie pozycji

Na początek spójrzmy na wydajność algorytmu, względem procentu kapitału w pozycji. Nie ma tu zaskoczenia. Czym więcej środków, tym większy poziom ryzyka. W przypadku dobrych parametrów sygnału, opłaca się otwierać większe pozycje. Przyda nam się pamiętać to przy następnych wykresach.

Sygnał pozycji short, oraz pozycji long znacząco różnią się od siebie. Pierwsze co się wyróżnia, to że skala ma zupełnie inne wartości. Shorty - tylko ujemne, a longi tylko dodatnie. Dodatkowo wykres pozycji długich jest wyższy, oraz ma tendendę wzrostową przy wyjściu z pozycji równym \(1.05\). Wykres pozycji krótkich jest jak lekko pochylona płaszczyzna. Na obu wykresach, dla jednej kombinacji parametrów pozycji short znajduje się kilka punktów, ponieważ są to wartości dla różnych capital_percent.

Podsumowanie

Wyniki są bardzo ciekawe, chociaż sygnały nie dają dużego zwrotu w rzeczywistości, pomimo że pokazuje to najwydajniejsza pozycja (38% roczny wzrost). Zyski zjada prowizja brokera i spread ceny. Kolejnym aspektem jest, że algorytm po prostu zawsze kupował poniżej średniej i trzymał jak najdłużej. Cały trud mógł zrobić wykładniczy wzrost ceny bitcoina. Kierowanie się pojedyńczym SMA jak widać nie jest efeketywnym sygnałem rynkowym. Kolejnymi krokami rozwijania koncepcji opartej o SMA, może być zwiększenie ilości iterowanych parametrów, zmiana długości zbioru danych na dłuższy, podział takiego zbioru na części i sprawdzanie poszczególnych wydajności (np. w bull market lub bear market), oraz zwiększenie ilości SMA, do np. kilku co spotęgowało by skomplikowanie algorytmu.

Mowa końcowa

Najprostsze sygnały rynkowe nie są pomocne do oceny stanu rynku. Giełda to gra konkurencjyna, w której znalezienie dobrego prostego sygnału, spotka się od razu z otwarciem pozycji przez graczy, i w konsekwencji zmiany ceny, co czyni sygnał niedziałającym. Omawiane sygnały wymagają dalszej, o wiele głębszej analizy, aby dojść do sygnałów rentownych. Jednak wierzę, że tak prosta i podstawowa analiza jest w stanie otworzyć umysły na nieszablonowe myślenie oraz tworzyć pomysły na trudniejsze analizy. Uchroni także przed wierzeniem w pozornie działające sygnały pokazywane w internecie, gdzie autorzy zapewniają o dużych zyskach w krótkim czasie. Ważnym jest aby nie tylko zarobić, ale też nie stracić.